
package vistaprincipal;

import java.util.ArrayList;
import java.util.List;

public class PATmotor {
 List<Expresion> expresiones=new ArrayList();
 List<List> listas=new ArrayList();
 String impresion="";
 List<Expresion> reservados=new ArrayList();
public void Ejecuta(List<List> listas){
    this.listas=listas;
    //imprime la lista que recibo
    String impres="";
    listas.remove(listas.size()-1);
    for(int i=0;i<listas.size();i++){
        for(int j=0;j<listas.get(i).size();j++){
            impres+=listas.get(i).get(j);
        }
        impres+="\n";
    }
    System.out.println(impres);
    primerosPasos();
    int contax=1;
    boolean axioma=false;
    int tam_reservados=reservados.size();
    int renglonPadre=0;
    renglonPadre=expresiones.get(expresiones.size()-1).renglon;
    expresiones.get(expresiones.size()-1).ante.set(0," ");
    expresiones.get(expresiones.size()-1).ante.remove(expresiones.get(expresiones.size()-1).ante.size()-1);
    while(renglonPadre!=-1 || axioma==false){
        //System.out.println("renglon padre="+renglonPadre+"#expresiones= "+expresiones.size()+"#reservados="+reservados.size());
        Expresion expre= new Expresion(renglonPadre,expresiones.get(expresiones.size()-1).renglon+1,expresiones.get(renglonPadre-1).ante,expresiones.get(renglonPadre-1).conse);
        axioma=expre.es_axioma();   //aplico compara donde define posicion y regla
        if (axioma==false){
                reservados=expre.aplica_regla(reservados); //aplico regla
                if (reservados==null){break;}
                expresiones.add(expre);
                impresion+=expre.imprimeExp();
                axioma=expre.es_axioma();
                if(tam_reservados<reservados.size()){
                   expresiones.add(reservados.get(reservados.size()-1));
                   //impresion+=expresiones.get(expresiones.size()-1).imprimeExp();
                   if(axioma==false){
                       renglonPadre=expresiones.get(expresiones.size()-2).renglon;
                   }             
                   else{
                       impresion+="\t\t\ta)Axioma "+contax+"\n";
                       System.out.print("\t\t\ta)Axioma "+contax+"\n");
                       contax++;
                       expre=reservados.remove(reservados.size()-1);
                       renglonPadre=expre.renglon;
                   }
                   impresion+=expresiones.get(expresiones.size()-1).imprimeExp();
                }
                else{
                   if(axioma==false){//no es axioma  y no se agrego nada a reservasos
                       renglonPadre=expresiones.get(expresiones.size()-1).renglon;
                   }             
                   else{  //si es axioma  y no se agrego nada a reservasos
                       impresion+="\t\t\tb)Axioma "+contax+"\n";
                       System.out.print("\t\t\tb)Axioma "+contax+"\n");
                       contax++;
                       if (reservados.size()!=0){
                           expre=reservados.remove(reservados.size()-1);
                           renglonPadre=expre.renglon;
                       }
                       else
                           renglonPadre=-1;
                   }
                    //renglonPadre=reservados.remove(reservados.size()-1).renglon;
                }
        }
        else{
            impresion+="\t\t\tc)Axioma "+contax+"\n";
            System.out.print("\t\t\tc)Axioma "+contax+"\n");
            contax++;
            if (reservados.size()!=0){
               expre=reservados.remove(reservados.size()-1);
               renglonPadre=expre.renglon;
            }
            else
            renglonPadre=-1;
        }
        expre=null;
        tam_reservados=reservados.size();
        //System.out.println("renglonPadre="+renglonPadre);
    }
    if (reservados==null){impresion+="=(";}
    else impresion+="=)";
}

public void primerosPasos (){
    List<String> ante=new ArrayList(),conse=new ArrayList();    
    for(int i=0;i<listas.size();i++){
     ante.clear();
     conse.clear();     
     ante.add("[");
     for(int j=0;j<listas.size()-1;j++){
         ante.add("(");
         ante.addAll(listas.get(j));
         ante.add(")");
         if(j+2!=listas.size()){
             if(j<i-1)
             ante.add(",");
             else
             ante.add("∧");
         }
         else
             ante.add("]");         
     }
    conse.addAll(listas.get(listas.size()-1)); 
    expresiones.add(new Expresion(i,i+1,ante,conse));
    if(i==1)expresiones.get(i).regla=9;
    else
    expresiones.get(i).regla=2;
    impresion+=expresiones.get(i).imprimeExp();
    }
    
    
}

}

